package es.ise.core.mbg.plugins.utils;

import java.util.Arrays;
import java.util.HashSet;
import java.util.Set;
import java.util.regex.Matcher;
import java.util.regex.Pattern;

import org.mybatis.generator.api.IntrospectedColumn;
import org.mybatis.generator.api.IntrospectedTable;

/**
 * Clase con utilidades en el manejo de tablas durante la generación
 * de código de MyBatis
 * 
 * @author Paco
 *
 */
public class TableUtilities
{
	// pattern to detects initial prefix
	private static final Pattern initialPrefixPattern = Pattern.compile("^(\\w+?)_.*$");
	
	/**
	 * Calcula cual es el prefijo de la tabla (utilizando '_' como separador), si todas las
	 * columnas tienen el mismo prefijo. Si no es así, devuelve <code>null</code>, indicando
	 * que la tabla no tiene prefijo propio.
	 * 
	 * @param table la tabla que se está procesando
	 * @return el prefijo de la tabla, o <code>null</code> si la tabla no tiene prefijo propio
	 */
	public static String getTablePrefix(IntrospectedTable table)
	{
		Set<String> prefixes = new HashSet<String>();
		for(IntrospectedColumn column: table.getAllColumns())
		{
			Matcher matcher = initialPrefixPattern.matcher(column.getActualColumnName());
			if(matcher.find())
			{
				prefixes.add(matcher.group(1));
				if(prefixes.size() > 1)
				{
					return null; //if all properties does not match the prefix, no column renaming rule is posible
				}
			}
			else
			{
				return null; //if a property no has prefix, no column renaming rule is posible
			}
		}
		return (String)prefixes.toArray()[0];
	}
	
	public static Set<String> getAuthoringColumns(IntrospectedTable table)
	{
		String prefix = getTablePrefix(table);
		return new HashSet<String>(Arrays.asList(
			prefix + "_F_CREACION",
			prefix + "_U_CREACION",
			prefix + "_F_ACTU",
			prefix + "_U_ACTU"
		));
	}
}
